#ifndef KEY_MANAGER_H
#define KEY_MANAGER_H

#include <stdint.h>
#include <stdbool.h>
#include "LinkList.h"

/// @brief 按键事件
typedef enum {
	KEY_EVENT_NONE = 0X00,
	KEY_EVENT_DOWN = 0X01,	//按下事件
	KEY_EVENT_UP = 0X02,	//弹开事件
	KEY_EVENT_LONG = 0X04,	//长按事件
	KEY_EVENT_DOUBLE = 0X08	//双击事件
} key_event_t;

/// @brief 按键识别码
typedef struct {
	uint8_t state;		//状态（按键事件）
	uint8_t id;			//组别	
	uint16_t keyId;		//按键ID，0表示当前组未被按下
} keyValue_t;


/// @brief 定义按键基类，其他按键都基于此类
typedef struct {
	LIST_NODE list;	//侵入式链表
	uint8_t id;		//组别ID
	uint8_t type;	//按键类型，0表示独立按键，1表示矩阵按键，2表示AD按键，其他数字用户自己扩展
	uint16_t startKeyId;	//按键起始id
	uint16_t keyCount;		//按键个数
	uint16_t (*getKeyID)(void);				//获取某个按键ID，并把ID反馈出去
	keyValue_t keyValue;	//按键结果	
} key_base_t;


void keyManagerInit(void);

uint8_t keyManagerAddGroup(key_base_t* keyGroup,void (*keyEvent)(keyValue_t,void *),  void * userData);

void keyManagerScankeyEvent(void);